#include"include/muduo/net/TcpServer.h"
#include"include/muduo/net/EventLoop.h"
#include"include/muduo/net/TcpConnection.h"
#include<iostream>
#include<functional>
#include<string>
#include<unordered_map>
using namespace std;
class TranslateServer{
    public:
    TranslateServer(int port):_server(&_baseloop,muduo::net::InetAddress("0.0.0.0",port),"TranslateServer",muduo::net::TcpServer::kReusePort){
        //auto funca=std::bind(&TranslateServer::onConnection,this,std::_placeholder::_1);
        auto func1=std::bind(&TranslateServer::onConnection,this,std::placeholders::_1);
        _server.setConnectionCallback(func1);
        _server.setMessageCallback(std::bind(&TranslateServer::onMassge,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));
    }
    void Start()
    {
        //开启服务器
        _server.start();//开始事件监听
        _baseloop.loop();//开始事件监控,这是一个阻塞式的死循环
    }
    //private:
    void onConnection(const muduo::net::TcpConnectionPtr&conn)
    {
        //新建连接成功时的回调函数
        if(conn->connected()==true)
        {
            std::cout<<"连接成功！"<<std::endl;
        }
        else
        {
            std::cout<<"连接失败!"<<std::endl;
        }
    }
    string Translate(string str)
    {
        static std::unordered_map<std::string,std::string> dict={
            {"苹果","apple"},
            {"pear","梨"}
        };
        auto it=dict.find(str);
        if(it==dict.end())
        {
            return "听不懂！";
        }
        else
        {
            return it->second;
        }
    }
    void onMassge(const muduo::net::TcpConnectionPtr&conn,muduo::net::Buffer*buf,muduo::Timestamp)
    {
        //通信请求时的回调函数
        string str=buf->retrieveAllAsString();//拿出里面的数据

        string message=Translate(str);

        conn->send(message);
    }
    private:
    muduo::net::EventLoop _baseloop;//当事件到来时就去处理
    muduo::net::TcpServer _server;//告诉服务器什么业务该怎么处理
};

int main()
{
    TranslateServer server(8888);
    server.Start();
    return 0;
}